const eventBus = require('../utils/eventBus')

// Function.prototype（看成一个整体）, 增加一个after字段
Function.prototype.after = function (fn) {
  const _this = this; // 本质是load对象调用了原型链上的after方法，this指向load对象（函数）

  return function () { // 这里是<新load函数>可以看下面，该函数直接调用this指向window
    // _this指向load，这里是调用load函数执行。arguments是新load函数的入参
    _this.apply(this, arguments);
    if (fn && typeof fn === 'function') {
      fn.apply(this);// 
    }
  };
};

Function.prototype.before = function (fn) {
  const _this = this; // 本质是load对象调用了原型链上的after方法，this指向load对象（函数）

  return function () { // 这里是<新load函数>可以看下面，该函数直接调用this指向window
    if (fn && typeof fn === 'function') {
      fn.apply(this);// 
    }
    _this.apply(this, arguments);  // _this指向load，这里是调用load函数执行。arguments是新load函数的入参
  };
};

class RootApi {
  constructor() {
   
  }
 
  Page(options) {
    const customHooks = {
      // 默认onLoad 钩子
      onLoad() { },
      // 在页面默认onLoad之前触发。目前的想法是：在这个钩子中挂载 订阅事件 
      // onBeforeLoad(){ }
    };
    const newOptions = {
      ...customHooks,
      ...options,
    }

    //在onLoad执行前挂载一个eventBus，在Page中可以通过this访问
    newOptions.onLoad = newOptions.onLoad.before(function () {
      this.eventBus = eventBus
    });

    return Page(newOptions)
  }

  /**
   * 自定义showModal弹窗
   * 调用方式： new RootApi.openModalDialog.call(this)  
   * call将页面实例传入
   */
  openModalDialog(params) {
    const dialogInstance = this.selectComponent('#app-root >>> #global-modal-dialog')
    return new Promise((resolve) => {
      dialogInstance.open({
        ...params,
        success: (res) => {
          if (res.confirm) {
            resolve(true)
          } else {
            resolve(false)
          }
        }
      })
    })
  }

  onGetLocation() { } // 成功、失败
  onGetCacheLocation() { } // 缓存
}



module.exports = new RootApi()